package studio.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import studio.excepcion.DAOExcepcion;
import studio.modelo.Armado;
import studio.modelo.InstBasico;
import studio.modelo.Sala;
import studio.modelo.SerBasico;
import studio.modelo.TipoRecurso;
import studio.util.ConexionBD;

import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.Collection;

public class SalaArmadaDAO extends BaseDAO {
	
		public String insertarSalaArma(Armado objSalaArm) throws DAOExcepcion {
			String mensaje="";
		System.out.println("SalaArmadoDAO: insertar(SalaArmada)");
		String query = "INSERT INTO SalaArmada(Sala_idSala,Usuario_idUsuario,ssTotal,fecha) VALUES (?,?,?,?)";		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);			
			stmt.setInt(1,objSalaArm.getObjSala().getIdSala());			
			stmt.setInt(2,objSalaArm.getObjAdmin().getIdUsuario());
			stmt.setDouble(3,objSalaArm.getTotal());
			stmt.setString(4,objSalaArm.getFecha());
			int i = stmt.executeUpdate();
			if (i != 1) {
				mensaje="03.-No se pudo registrar el Armado de Sala";
				throw new SQLException("No se pudo insertar");
			}
			else
			{
				int idNroArmado=0;
				String ConsultarIdGenerado="SELECT LAST_INSERT_ID()";
				stmt=con.prepareStatement(ConsultarIdGenerado);
				rs=stmt.executeQuery();
				if(rs.next())
				{
					idNroArmado=rs.getInt(1);
				}
				objSalaArm.setIdSalaArmada(idNroArmado);
				System.out.println("Nueva Sala Armada " + idNroArmado);
				System.out.println("registrado Ok");
				for (InstBasico intru : objSalaArm.getInstbasicos()) {
					String detalleInstrumento="insert into SalaArm_Instrumento(Sala_Armada_idSalaArmada,Instrumento_idInstrumento,TipoRecurso_idTipoRecurso,qtInstrBasico,importe) values(?,?,?,?,?)";
					stmt=con.prepareStatement(detalleInstrumento);
					stmt.setInt(1,objSalaArm.getIdSalaArmada());
					stmt.setInt(2, intru.getIdInstrumento());
					stmt.setInt(3,intru.objTipRecur.getIdTipoRecurso() );
					stmt.setDouble(4,intru.getQtInstBasico());
					stmt.setDouble(5, intru.getImporte());
					int insertarInstru=0;
					insertarInstru=stmt.executeUpdate();
					if(insertarInstru!=1)
					{
						throw new SQLException("No se pudo insertar");
					}
					else
					{
						System.out.println("Instrumento Insertado Correctamnte");
					}
				}
				
				for (SerBasico serv:objSalaArm.getSerbasicos())
				{
					String detalleServicio="insert into SalaArm_ServicioAdici(Sala_Armada_idSalaArmada,TipoRecurso_idTipoRecurso,Servicio_idServicio,qtServ,importe)values(?,?,?,?,?)";
					stmt=con.prepareStatement(detalleServicio);
					stmt.setInt(1,objSalaArm.getIdSalaArmada());
					stmt.setInt(2,serv.objTipRecur.getIdTipoRecurso() );
					stmt.setInt(3,serv.objServicio.getIdServicio() );
					stmt.setInt(4,serv.getQtSer());
					stmt.setDouble(5,serv.getImporte());
					int insertarServ=0;
					insertarServ=stmt.executeUpdate();
					if(insertarServ!=1)
					{
						throw new SQLException("No se pudo insertar el servicio");
					}
					else
					{
						System.out.println("Servicio Insertado Correctamnte");
					}
				}
				mensaje="04.-Armado de Sala Registrado Correctamente";
			}
			}catch (SQLException e) {
				System.err.println(e.getMessage());
				mensaje=e.getMessage();
				throw new DAOExcepcion(e.getMessage());
			} 
			finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);		
			}
		return mensaje;
}
		
		public Armado RetornarSalaArmada(int idSalaArmada) throws DAOExcepcion {
			System.out.println("SalaDAO: RetornarSalaArmada(int DescSala)");
			Armado objArm = new Armado();
			Connection con = null;
			PreparedStatement stmt = null;
			ResultSet rs = null;
			ResultSet rsInstru = null;
			ResultSet rsServi = null;
			try {
				String query = "SELECT arm.idsalaarmada,arm.sala_idsala,s.nombesala,arm.usuario_idusuario,arm.sstotal,arm.fecha FROM salaarmada arm "
+" inner join sala s on arm.sala_idsala=s.idsala  where idsalaarmada=?";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setInt(1, idSalaArmada);
				rs = stmt.executeQuery();
				if (rs.next()) {
					objArm.setIdSalaArmada(rs.getInt("idsalaarmada"));
					Sala objSala=new Sala();
					objSala.setIdSala(rs.getInt("sala_idsala"));
					objSala.setNombreSala(rs.getString("nombesala"));
					objArm.setObjSala(objSala);
					
					String instru="	select arm.Sala_Armada_idSalaArmada,arm.Instrumento_idInstrumento,arm.TipoRecurso_idTipoRecurso,arm.qtInstrBasico,arm.importe "+
					" from SalaArm_Instrumento arm "+
					" inner join instrumento intr on arm.Instrumento_idInstrumento=intr.idinstrumento "+
					" where sala_armada_idsalaarmada=? ";
					con = ConexionBD.obtenerConexion();
					stmt = con.prepareStatement(instru);
					stmt.setInt(1, idSalaArmada);
					rsInstru = stmt.executeQuery();
					
					Collection<InstBasico>listaInstrumento=new ArrayList<InstBasico>();
					while (rsInstru.next()) {
						InstBasico vo = new InstBasico();
						vo.setObjSalArm(objArm);
						vo.objInst.setIdInstrumento(rsInstru.getInt("arm.Instrumento_idInstrumento"));
						vo.objTipRecur.setIdTipoRecurso(rsInstru.getInt("TipoRecurso_idTipoRecurso"));
						vo.setQtInstBasico(rsInstru.getInt("qtInstrBasico"));
						vo.setImporte(rsInstru.getDouble("importe"));
						listaInstrumento.add(vo);
					}
					objArm.setInstbasicos(listaInstrumento);
					
					
					String servi="select Sala_Armada_idSalaArmada,TipoRecurso_idTipoRecurso,Servicio_idServicio,qtServ,importe "+ 
					" from studio7i.salaarm_servicioadici where Sala_Armada_idSalaArmada=?";
					con = ConexionBD.obtenerConexion();
					stmt = con.prepareStatement(servi);
					stmt.setInt(1, idSalaArmada);
					rsServi = stmt.executeQuery();
					
					Collection<SerBasico>listaServicio=new ArrayList<SerBasico>();
					while (rsServi.next()) {
						SerBasico objSer = new SerBasico();
						objSer.setObjSalArm(objArm);
						TipoRecurso objTipRecurso=new TipoRecurso();
						objTipRecurso.setIdTipoRecurso(rsServi.getInt("TipoRecurso_idTipoRecurso"));
						objSer.setObjTipRecur(objTipRecurso);
						objSer.setIdServicio(rsServi.getInt("Servicio_idServicio"));
						objSer.setQtSer(rsServi.getInt("qtServ"));
						objSer.setImporte(rsServi.getDouble("importe"));
						listaServicio.add(objSer);
					}
					objArm.setSerbasicos(listaServicio);
//					select arm.Sala_Armada_idSalaArmada,arm.Instrumento_idInstrumento,arm.TipoRecurso_idTipoRecurso,arm.qtInstrBasico,arm.importe
//					from SalaArm_Instrumento arm
//					inner join instrumento intr on arm.Instrumento_idInstrumento=intr.idinstrumento
//					where sala_armada_idsalaarmada=2;
//	
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return objArm;
		}
		

		public Collection<Armado>  RetornarSalasArmadas() throws DAOExcepcion {
			System.out.println("SalaDAO: RetornarSalaArmada(int DescSala)");
			Collection<Armado> listaArmados = new ArrayList<Armado>();
			
			Connection con = null;
			PreparedStatement stmt = null;
			ResultSet rs = null;
			ResultSet rsInstru = null;
			ResultSet rsServi = null;
			try {
				String query = "SELECT arm.idsalaarmada,arm.sala_idsala,s.nombesala,arm.usuario_idusuario,arm.sstotal,arm.fecha FROM salaarmada arm "
					+" inner join sala s on arm.sala_idsala=s.idsala";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				
				rs = stmt.executeQuery();
				while (rs.next()) {
					Armado objArm = new Armado();
					objArm.setIdSalaArmada(rs.getInt("idsalaarmada"));
					Sala objSala=new Sala();
					objSala.setIdSala(rs.getInt("sala_idsala"));
					objSala.setNombreSala(rs.getString("nombesala"));
					objArm.setFecha(rs.getString("fecha"));//sstotal
					objArm.setTotal(rs.getDouble("sstotal"));
					objArm.setObjSala(objSala);
					
					String instru="select arm.Sala_Armada_idSalaArmada,arm.Instrumento_idInstrumento,arm.TipoRecurso_idTipoRecurso,arm.qtInstrBasico,arm.importe,intr.costoxhora,intr.caracteristica,tr.descripcion "+ 
" from SalaArm_Instrumento arm  inner join instrumento intr on arm.Instrumento_idInstrumento=intr.idinstrumento "+
" inner join tiporecurso tr on tr.idTipoRecurso=arm.TipoRecurso_idTipoRecurso "+
					" where sala_armada_idsalaarmada=?  ";
					con = ConexionBD.obtenerConexion();
					stmt = con.prepareStatement(instru);
					stmt.setInt(1, rs.getInt("idsalaarmada"));
					rsInstru = stmt.executeQuery();
					
					Collection<InstBasico>listaInstrumento=new ArrayList<InstBasico>();
					while (rsInstru.next()) {
						InstBasico vo = new InstBasico();
						vo.setObjSalArm(objArm);
						vo.objInst.setIdInstrumento(rsInstru.getInt("arm.Instrumento_idInstrumento"));
						vo.objTipRecur.setIdTipoRecurso(rsInstru.getInt("TipoRecurso_idTipoRecurso"));
						vo.objTipRecur.setDescripcion(rsInstru.getString("descripcion"));
						vo.setCostoxHora(rsInstru.getDouble("costoxhora"));
						vo.setQtInstBasico(rsInstru.getInt("qtInstrBasico"));
						vo.setImporte(rsInstru.getDouble("importe"));
						vo.setCaracteristicas(rsInstru.getString("caracteristica"));
						listaInstrumento.add(vo);
					}
					objArm.setInstbasicos(listaInstrumento);
					String servi="select ser.Sala_Armada_idSalaArmada,ser.TipoRecurso_idTipoRecurso,ser.Servicio_idServicio,ser.qtServ,ser.importe,tr.descripcion,s.descripcionServicio,s.costoxHora "+
" from studio7i.salaarm_servicioadici ser inner join tiporecurso tr on ser.TipoRecurso_idTipoRecurso=tr.idTipoRecurso "+
" inner join servicio s on s.idservicio=ser.Servicio_idServicio where Sala_Armada_idSalaArmada=?";
					con = ConexionBD.obtenerConexion();
					stmt = con.prepareStatement(servi);
					stmt.setInt(1,rs.getInt("idsalaarmada"));
					rsServi = stmt.executeQuery();
					
					Collection<SerBasico>listaServicio=new ArrayList<SerBasico>();
					while (rsServi.next()) {
						SerBasico objSer = new SerBasico();
						objSer.setObjSalArm(objArm);
						TipoRecurso objTipRecurso=new TipoRecurso();
						objTipRecurso.setIdTipoRecurso(rsServi.getInt("TipoRecurso_idTipoRecurso"));
						objTipRecurso.setDescripcion(rsServi.getString("descripcion"));
						objSer.setObjTipRecur(objTipRecurso);
						objSer.setIdServicio(rsServi.getInt("Servicio_idServicio"));//s.descripcionServicio
						objSer.setDescripcionServicio(rsServi.getString("descripcionServicio"));
						objSer.setQtSer(rsServi.getInt("qtServ"));
						objSer.setImporte(rsServi.getDouble("importe"));
						objSer.setCostoxHora(rsServi.getDouble("costoxHora"));
						listaServicio.add(objSer);
					}
					objArm.setSerbasicos(listaServicio);
//					select arm.Sala_Armada_idSalaArmada,arm.Instrumento_idInstrumento,arm.TipoRecurso_idTipoRecurso,arm.qtInstrBasico,arm.importe
//					from SalaArm_Instrumento arm
//					inner join instrumento intr on arm.Instrumento_idInstrumento=intr.idinstrumento
//					where sala_armada_idsalaarmada=2;
					listaArmados.add(objArm);
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return listaArmados;
		}
		
		
		
	public void Verificacion(Armado obj)
	{
	int nro;
	nro=obj.getInstbasicos().size();
	System.out.println(nro);
	nro=obj.getSerbasicos().size();
	System.out.println(nro);
	}
}